home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Genie / Projects / AEA / Source / Sources / Apple Events / AEAAppleEventSender.cc < prev   
Encoding:
C/C++ Source or Header  |  2000-06-24  |  3.2 KB  |  149 lines

  1. /*    ======================
  2.  *    AEAAppleEventSender.cc
  3.  *    ======================
  4.  */
  5.  
  6. #include "AEADebugging.h"
  7.  
  8. #include <string.h>
  9.  
  10. #include <AEBuild.h>
  11.  
  12. #include "DGHandleLocker.hh"
  13.  
  14. #include "AEAAppleEvent.hh"
  15. #include "AEAAppleEventSender.hh"
  16.  
  17. AEAAppleEventSender::AEAAppleEventSender(AEEventClass inEventClass, AEEventID inEventID)
  18. : mEventClass(inEventClass), mEventID(inEventID), mAEIdleUPP(NULL)
  19. , mAddress(gNullDesc), mGizmoBuildString(NULL), mAppleEvent(gNullDesc)
  20. {
  21.     
  22. }
  23.  
  24. AEAAppleEventSender::AEAAppleEventSender(AEEventClass inEventClass, AEEventID inEventID, AEIdleUPP &inAEIdleUPP)
  25. : mEventClass(inEventClass), mEventID(inEventID), mAEIdleUPP(inAEIdleUPP)
  26. , mAddress(gNullDesc), mGizmoBuildString(NULL), mAppleEvent(gNullDesc)
  27. {
  28.     
  29. }
  30.  
  31. AEAAppleEventSender::~AEAAppleEventSender()
  32. {
  33.     OSErr err;
  34.     
  35.     if (mGizmoBuildString)
  36.         delete mGizmoBuildString;
  37.     
  38.     err = ::AEDisposeDesc(&mAddress);
  39.     err = ::AEDisposeDesc(&mAppleEvent);
  40. }
  41.  
  42. void
  43. AEAAppleEventSender::SetAddress(const ProcessSerialNumber &inPSN)
  44. {
  45.     OSErr err;
  46.     
  47.     err = ::AEDisposeDesc(&mAddress);
  48.     err = ::AECreateDesc(typeProcessSerialNumber, &inPSN, sizeof inPSN, &mAddress);
  49.     ThrowIfOSErr_(err);
  50. }
  51.  
  52. void
  53. AEAAppleEventSender::SetAddress(const OSType inSignature)
  54. {
  55.     OSErr err;
  56.     
  57.     err = ::AEDisposeDesc(&mAddress);
  58.     err = ::AECreateDesc(typeApplSignature, &inSignature, sizeof inSignature, &mAddress);
  59.     ThrowIfOSErr_(err);
  60. }
  61.  
  62. void
  63. AEAAppleEventSender::SetAddress(const TargetID &inTargetID)
  64. {
  65.     OSErr err;
  66.     
  67.     err = ::AEDisposeDesc(&mAddress);
  68.     err = ::AECreateDesc(typeTargetID, &inTargetID, sizeof inTargetID, &mAddress);
  69.     ThrowIfOSErr_(err);
  70. }
  71.  
  72. void
  73. AEAAppleEventSender::SetGizmoBuildString(const char *inString)
  74. {
  75.     if (inString == NULL) throw paramErr;
  76.     
  77.     if (mGizmoBuildString != NULL)
  78.         if (strcmp(mGizmoBuildString, inString) == 0)
  79.             return;
  80.         else {
  81.             delete mGizmoBuildString;
  82.             ::AEDisposeDesc(&mAppleEvent);
  83.         }
  84.     mGizmoBuildString = new char [strlen(inString) + 1];
  85.     strcpy(mGizmoBuildString, inString);
  86. }
  87.  
  88. void
  89. AEAAppleEventSender::Build()
  90. {
  91.     OSErr err;
  92.     
  93.     if (mAddress.descriptorType == typeNull)
  94.         throw errAEUnknownAddressType;
  95.     
  96.     if (mGizmoBuildString == NULL)
  97.         SetGizmoBuildString("");
  98.     
  99.     err = ::AEDisposeDesc(&mAppleEvent);
  100.     ThrowIfOSErr_(err);
  101.     
  102.     //::HLock(mAddress.dataHandle); // Change this to something scalable
  103.     DGHandleLocker lock(mAddress.dataHandle);
  104.     err = ::AEBuildAppleEvent(mEventClass, mEventID,
  105.         mAddress.descriptorType, *mAddress.dataHandle, GetHandleSize(mAddress.dataHandle),
  106.         kAutoGenerateReturnID, kAnyTransactionID, &mAppleEvent, mGizmoBuildString);
  107.     //::HUnlock(mAddress.dataHandle);
  108.     ThrowIfOSErr_(err);
  109. }
  110.  
  111. void
  112. AEAAppleEventSender::Send()
  113. {
  114.     OSErr err;
  115.     
  116.     if (mAppleEvent.descriptorType == typeNull)
  117.         Build();
  118.     
  119.     AEAAppleEvent evt(mAppleEvent);
  120.     evt.Send(kAENoReply, mAEIdleUPP);
  121. }
  122.  
  123. void
  124. AEAAppleEventSender::SendAndWaitForReply(AppleEvent &outReply)
  125. {
  126.     OSErr err;
  127.     
  128.     if (mAppleEvent.descriptorType == typeNull)
  129.         Build();
  130.     
  131.     AEAAppleEvent evt(mAppleEvent);
  132.     evt.Send(kAEWaitReply, mAEIdleUPP);
  133.     evt.GetReply(outReply);
  134. }
  135.  
  136. void
  137. AEAAppleEventSender::SendAndWaitForReply(AEADescAppleEvent &outReply)
  138. {
  139.     OSErr err;
  140.     
  141.     if (mAppleEvent.descriptorType == typeNull)
  142.         Build();
  143.     
  144.     AEAAppleEvent evt(mAppleEvent);
  145.     evt.Send(kAEWaitReply, mAEIdleUPP);
  146.     evt.GetReply(outReply);
  147. }
  148.  
  149.